home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-03-03 | 10.6 KB | 395 lines | [TEXT/PJMM] |
- {Miscellaneous utility routines that I developed while writing Solitaire House,}
- {mostly rather simple graphic effects.}
-
- unit MiscGraphics;
-
- interface
-
- uses
- {$ifc UNDEFINED THINK_PASCAL}
- Types, QuickDraw, Events, Windows, Dialogs, Fonts, DiskInit, TextEdit, Traps,{}
- Memory, SegLoad, Scrap, ToolUtils, OSUtils, Menus, Resources, StandardFile,{}
- GestaltEqu, Files, Errors, Devices, QuickDrawText,
- {$endc}
- SAT;
-
- {*** Some QuickDraw-related utilities: ***}
-
- function MakeRGBColor (r, g, b: Integer): RGBColor;
- function RectWidth (r: Rect): integer;
- function RectHeight (r: Rect): integer;
-
- {Is smallR completely within bigR?}
- function RectInsideRect (smallR, bigR: Rect): Boolean;
- {Center the Rect s1R on s2R}
- function CenterRectInRect (s1R: Rect; s2R: Rect): Rect;
-
- {Draw a string centered withing the box.}
- procedure StringCenter (aString: Str255; box: Rect; truncate: Boolean; shadow: Integer);
-
- {Wipes for using as transitions after changing gSAT.offScreen.}
- procedure WipeIn (ticks: Longint);
- procedure WipeOut (ticks: Longint);
-
- {Copy the contents of one SATPort to another.}
- procedure CopyScreen (fromScreen, toScreen: SATPort);
-
- {Make a zoom animation}
- procedure ZoomRects (fromRect, toRect: Rect);
-
- {*** A face manipulation routines. ***}
-
- {Copy srcFace to destFace. If destFace is nil, a new face is created, otherwise srcFace is}
- {copied to the existing dstFace.}
- procedure SATDupFace (var destFace: FacePtr; srcFace: FacePtr);
-
- {*** Pattern and cursor utilities. ***}
-
- {These pattern utilities replaces the old ones in the SAT lib. These are much easier to use}
- {and just as compatible. The point with them is to have glue routies that make it really}
- {easy to stay compatible with all old Macs, even old MacPlusses!}
-
- function SATGetPattern (patID: Integer): PixPatHandle;
- procedure SATForePattern (pat: PixPatHandle);
- procedure SATBackPattern (pat: PixPatHandle);
- procedure SATFillRect (r: Rect; pat: PixPatHandle);
- procedure SATDisposePattern (pat: PixPatHandle);
-
- function SATGetCursor (id: Integer): CursHandle;
- procedure SATSetCursor (curs: CursHandle);
- procedure SATDisposeCursor (curs: CursHandle);
-
- implementation
-
- function MakeRGBColor (r, g, b: Integer): RGBColor;
- begin
- MakeRGBColor.red := r;
- MakeRGBColor.green := g;
- MakeRGBColor.blue := b;
- end;
-
- function RectWidth (r: Rect): integer;
- begin
- RectWidth := r.right - r.left;
- end;
- function RectHeight (r: Rect): integer;
- begin
- RectHeight := r.bottom - r.top;
- end;
-
- function RectInsideRect (smallR, bigR: Rect): Boolean;
- begin
- RectInsideRect := false;
- if smallR.left >= bigR.left then
- if smallR.top >= bigR.top then
- if smallR.right <= bigR.right then
- if smallR.bottom <= bigR.bottom then
- RectInsideRect := true;
- end; {RectInsideRect}
-
- function CenterRectInRect (s1R: Rect; s2R: Rect): Rect;
- var
- dx, dy: Integer;
- dR: Rect;
- begin
- dx := RectWidth(s1R);
- dy := RectHeight(s1R);
-
- dR.left := s2R.left + BSR(RectWidth(s2R), 1) - BSR(dx, 1);
- dR.top := s2R.top + BSR(RectHeight(s2R), 1) - BSR(dy, 1);
- dR.right := dR.left + dx;
- dR.bottom := dR.top + dy;
- CenterRectInRect := dR;
- end; {CenterRectInRect}
-
-
- procedure StringCenter (aString: Str255; box: Rect; truncate: Boolean; shadow: Integer);
- var
- finf: FontInfo;
- savePt: Point;
- saveCol, saveCol2, col: RGBColor;
- hpos, vpos: integer;
- oldPen: PenState;
- begin
- {Cut it down to fit!}
- if truncate then
- if StringWidth(aString) > (box.right - box.left) then
- repeat
- aString[0] := char(ord(aString[0]) - 1);
- aString[ord(aString[0])] := '…';
- until (StringWidth(aString) <= (box.right - box.left)) or (length(aString) < 2);
-
- GetFontInfo(finf);
-
- {Vertically: Center on the box.}
- if shadow <> 0 then
- vpos := box.top + (box.bottom - box.top - (finf.ascent + finf.descent + finf.leading + shadow)) div 2 + finf.leading + finf.ascent
- else
- vpos := box.top + (box.bottom - box.top - (finf.ascent + finf.descent + finf.leading)) div 2 + finf.leading + finf.ascent;
- {Horizontally: The left edge of the box plus half.}
- hpos := (box.right - StringWidth(aString)) div 2 + box.left div 2;
- MoveTo(hpos, vpos);
-
- if shadow <> 0 then
- begin
- GetPen(savePt);
- Move(shadow, shadow);
- if gSAT.initDepth > 1 then
- GetForeColor(saveCol);
- ForeColor(blackCOlor);
- DrawString(aString);
- MoveTo(savePt.h, savePt.v);
- if gSAT.initDepth > 1 then
- RGBForeColor(saveCol);
- end;
- DrawString(aString);
- end; {StringCenter}
-
-
- procedure WipeIn (ticks: Longint);
- var
- i: Integer;
- reg1, reg2: RgnHandle;
- r1, r2: Rect;
- startTicks, amount: Longint;
- const
- kWipeSteps = 10;
- begin
- SATSetPortScreen;
- reg1 := NewRgn;
- reg2 := NewRgn;
- startTicks := TickCount;
- r1 := gSAT.offScreen.port^.portRect;
- repeat
- amount := TickCount - startTicks;
- if amount > ticks then
- amount := ticks;
-
- r2.left := amount * Longint(gSAT.offSizeH) div 2 div ticks;
- r2.right := gSAT.offSizeH - r2.left;
- r2.top := amount * Longint(gSAT.offSizeV) div 2 div ticks;
- r2.bottom := gSAT.offSizeV - r2.top;
-
- RectRgn(reg1, r1);
- RectRgn(reg2, r2);
- DiffRgn(reg1, reg2, reg1);
- CopyBits(gSAT.offScreen.port^.portBits, gSAT.wind.port^.portBits, gSAT.offScreen.port^.portRect, gSAT.offScreen.port^.portRect, srcCopy, reg1);
- r1 := r2;
- until amount >= ticks;
- DisposeRgn(reg1);
- DisposeRgn(reg2);
- end; {WipeIn}
-
- procedure WipeOut;
- var
- i: Integer;
- reg1, reg2: RgnHandle;
- r1, r2: Rect;
- startTicks, amount: Longint;
- const
- kWipeSteps = 10;
- begin
- SATSetPortScreen;
- reg1 := NewRgn;
- reg2 := NewRgn;
- startTicks := TickCount;
- SetRect(r1, gSAT.offSizeH div 2, gSAT.offSizeV div 2, gSAT.offSizeH div 2, gSAT.offSizeV div 2);
- repeat
- amount := TickCount - startTicks;
- if amount > ticks then
- amount := ticks;
-
- r2.left := gSAT.offSizeH div 2 - amount * Longint(gSAT.offSizeH) div 2 div ticks;
- r2.right := gSAT.offSizeH - r2.left;
- r2.top := gSAT.offSizeV div 2 - amount * Longint(gSAT.offSizeV) div 2 div ticks;
- r2.bottom := gSAT.offSizeV - r2.top;
-
- RectRgn(reg1, r1);
- RectRgn(reg2, r2);
- DiffRgn(reg2, reg1, reg1);
- CopyBits(gSAT.offScreen.port^.portBits, gSAT.wind.port^.portBits, gSAT.offScreen.port^.portRect, gSAT.offScreen.port^.portRect, srcCopy, reg1);
- r1 := r2;
- until amount >= ticks;
- DisposeRgn(reg1);
- DisposeRgn(reg2);
- end; {WipeOut}
-
- procedure CopyScreen (fromScreen, toScreen: SATPort);
- var
- savePort: SATPort;
- begin
- SATGetPort(savePort);
- SATSetPort(toScreen);
- CopyBits(fromScreen.port^.portBits, toScreen.port^.portBits, fromScreen.bounds, toScreen.bounds, srcCopy, nil);
- SATSetPort(savePort);
- end; {CopyScreen}
-
- procedure ZoomRects (fromRect, toRect: Rect);
- const
- kNumSteps = 10;
- kFrameTime = 2;
- var
- r: Rect;
- finalTicks: Longint;
- i: Longint;
- begin
- SATSetPortScreen;
-
- PenMode(patXor);
- FrameRect(fromRect);
- r := fromRect;
- for i := 0 to kNumSteps do
- begin
- Delay(kFrameTime, finalTicks);
- FrameRect(r);
- r.top := (fromRect.top * (kNumSteps - i) + toRect.top * i) div kNumSteps;
- r.left := (fromRect.left * (kNumSteps - i) + toRect.left * i) div kNumSteps;
- r.bottom := (fromRect.bottom * (kNumSteps - i) + toRect.bottom * i) div kNumSteps;
- r.right := (fromRect.right * (kNumSteps - i) + toRect.right * i) div kNumSteps;
- FrameRect(r);
- end;
- FrameRect(toRect);
-
- PenMode(patCopy);
- end; {ZoomRects}
-
-
- {********* Faces ********}
-
- {Copy srcFace to destFace. Create destFace if necessary.}
- procedure SATDupFace (var destFace: FacePtr; srcFace: FacePtr);
- var
- savePort: SATPort;
- begin
- SATGetPort(savePort);
-
- if destFace = nil then
- destFace := SATNewFace(srcFace^.iconMask.bounds);
- SATSetPortFace(destFace);
- SATSetPortFace2(srcFace);
- CopyBits(gSAT.iconPort2.port^.portBits, gSAT.iconPort.port^.portBits, srcFace^.iconMask.bounds, srcFace^.iconMask.bounds, srcCopy, nil);
- SATSetPortMask(destFace);
- CopyBits(srcFace^.iconMask, destFace^.iconMask, srcFace^.iconMask.bounds, srcFace^.iconMask.bounds, srcCopy, nil);
- SATChangedFace(destFace);
- SATSetPort(savePort);
- end; {SATDupFace}
-
- {********* Patterns och cursors ********}
-
- function SATGetPattern (patID: Integer): PixPatHandle;
- var
- hPixPat: PixPatHandle;
- begin
- hPixPat := nil;
-
- if gSAT.colorFlag then
- hPixPat := GetPixPat(patID);
- if hPixPat = nil then
- hPixPat := PixPatHandle(GetPattern(patID));
- if hPixPat = nil then
- hPixPat := PixPatHandle(GetResource('ppat', patID));
-
- SATGetPattern := hPixPat;
- end; {SATGetPattern}
-
- procedure SATForePattern (pat: PixPatHandle);
- begin
- if pat = nil then
- Exit(SATForePattern);
- if GetHandleSize(Handle(pat)) = 8 then
- PenPat(PatHandle(pat)^^)
- else if gSAT.colorFlag then
- PenPixPat(pat)
- else
- PenPat(pat^^.pat1Data);
- end; {SATForePattern}
-
- procedure SATBackPattern (pat: PixPatHandle);
- begin
- if pat = nil then
- Exit(SATBackPattern);
- if GetHandleSize(Handle(pat)) = 8 then
- BackPat(PatHandle(pat)^^)
- else if gSAT.colorFlag then
- BackPixPat(pat)
- else
- BackPat(pat^^.pat1Data);
- end; {SATBackPattern}
-
- procedure SATFillRect (r: Rect; pat: PixPatHandle);
- begin
- SATForePattern(pat);
- PaintRect(r);
- {$IFC UNDEFINED THINK_PASCAL}
- PenPat(qd.black); {Borde egentligen återställa!}
- {$ELSEC}
- PenPat(black); {Borde egentligen återställa!}
- {$ENDC}
- end; {SATFillRect}
-
- procedure SATDisposePattern (pat: PixPatHandle);
- begin
- {$IFC UNDEFINED THINK_PASCAL}
- {PenPat(qd.black); {Borde egentligen återställa!}
- {$ELSEC}
- {PenPat(black); {Borde egentligen återställa!}
- {$ENDC}
- if pat = nil then
- Exit(SATDisposePattern);
- if (GetHandleSize(Handle(pat)) = 8) or (not gSAT.colorFlag) then
- ReleaseResource(Handle(pat))
- else
- DisposePixPat(pat); {DisposPixPat}
- end; {SATDisposePattern}
-
- {Color cursor glue.}
- {UNTESTED!}
-
- function SATGetCursor (id: Integer): CursHandle;
- var
- curs: CursHandle;
- begin
- curs := nil;
- if gSAT.colorFlag then
- curs := CursHandle(GetCCursor(id));
- if curs = nil then
- begin
- curs := GetCursor(id);
- if curs <> nil then
- HLock(Handle(curs));
- end;
- SATGetCursor := curs;
- end; {SATGetCursor}
-
- procedure SATSetCursor (curs: CursHandle);
- var
- cp: CursPtr;
- ccr: CCrsrHandle;
- begin
- if curs = nil then
- Exit(SATSetCursor);
- {68 bytes: old-style cursor}
- {96 bytes: CCrsr}
- if GetHandleSize(Handle(curs)) <= 68 then
- SetCursor(curs^^)
- else if gSAT.colorFlag then
- SetCCursor(CCrsrHandle(curs))
- else
- begin
- ccr := CCrsrHandle(curs);
- cp := CursPtr(@ccr^^.crsr1data);
- SetCursor(cp^);
- end;
- end; {SATSetCursor}
-
- procedure SATDisposeCursor (curs: CursHandle);
- begin
- if curs = nil then
- Exit(SATDisposeCursor);
- if GetHandleSize(Handle(curs)) <= 68 then
- ReleaseResource(Handle(curs))
- else
- DisposeCCursor(CCrsrHandle(curs)); {DisposCCursor}
- end; {SATDisposeCursor}
-
- end.